import Util from '@/js/Util.js'
export default {
    inject:{
        /**
         * 表单实例.RxForm.vue
         */
        formVm:{
            default:()=>{return{}}
        },
        /**
         * 上下文数据.
         */
        contextData:{
            type: Object
        }
    },
    emits: ['update:modelValue'],
    computed: {
        language(){
            let language= uni.getStorageSync('language');
            if(!language){
                language=process.env.VUE_APP_LANGUAGE;
            }
            return language || "zh-CN";
        },
        globalData() {
            //表单全部数据
            return this.formVm.data || {};
        },
        /*
         * 获取控件的placeholder
         */
        placeholder() {
            if (this.metadata.options && this.metadata.options.placeholder && this.metadata.options.placeholder['zh-CN']) {
                return this.$i18(this.metadata.options.placeholder)
            }
            return "";
        },
        /**
         *  获取当前用户ID
         */
        curUserId(){
            let userId= "";
            if(this.contextData){
                userId= this.contextData.curUserId || "";
            }
            return userId;
        },
    },
    props: {
        /**
         * 1.如果控件在主表 是表单的全部数据
         * 2.如果控件在子表 是当前行的数据
         */
        data: {
            type: Object,//表单全部数据
        },
        /**
         * 表单的控件数据.
         */
        metadata: {
            type: Object,
        },
        /**
         *当前控件值
         */
        modelValue: {
        },
        /**
         * 控件只读
         */
        readOnly: {
            default: () => {
                return false
            }
        },
    },
    data() {
        return {
            //当前数据（主表/子表）
            curData:this.data,
            canEdit: true,//是否可编辑
            value:'',
        }
    },
    methods: {
        getText(name){
            let language = uni.getStorageSync("language")
            if(typeof name === 'string'){
                if(name.includes('zh-CN')){
                    let obj =  new Function(`return ${name}`)()
                    return obj[language]
                }
                return name
            }
            return name && name[language]?name[language]:name
        },
        //值改变事件加延时
        triggerEmitEvents:Util.debounce(function (event, ...val) {
            //触发js脚本定义的事件
            this.$eventBus.$emit('triggerEmitEvents', val, this.metadata.on[event])
            //触发公共的事件
            let events=["change","blur","pressEnter","addInit","editInit","detailInit"];
            if (events.includes(event)) {
                this.$eventBus.$emit('handlePublicEvent', event, val, this.metadata);
            }
        }, 500),
        /**
         * 更新控件value 属性.
         * @param {Object} val - 需要更新的控件的值.
         */
        updateValue(val) {
            this.$emit('update:modelValue', val);
        },
        /**
         * 触发双向绑定，触发change事件。
         * @param {Object } value   - 控件的值
         */
        setData(value){
            this.updateValue(value);
            this.triggerEmitEvents('change',value, this.data)
        },
        /**
         * 获取当前字段的权限.
         * @returns {*}
         */
        getPermission(itemConfig){
            let permission=this.formVm.permission;
            if(itemConfig.field && permission){
                let fields;
                if(itemConfig.subTable) {
                    fields = permission && permission.subTable
                        && permission.subTable[itemConfig.subTable]
                        && permission.subTable[itemConfig.subTable].fields || {};
                }else {
                    fields = permission && permission.main && permission.main || {};
                }
                let obj=fields[itemConfig.field];
                if(obj.indexOf("{")!=-1){
                    return JSON.parse(obj) ;
                }
                return obj;
            }
            return null;
        },
        _asyncValue(val,callback){
            if(Object.prototype.toString.call(val) === '[object Promise]'){
                val.then(res=>{
                    /*触发v-model更新数据*/
                    this.updateValue(res);
                })
            }else {
                callback()
            }
        }
    },
    watch:{
        modelValue:{
            handler(){
                this.value = this.modelValue;
            },
            deep:true,
            immediate:true
        }
    }

}
